www.gusucode.com > 可隐藏可停靠可换肤的 OutLook工具条-源码程序 > 可隐藏可停靠可换肤的 OutLook工具条-源码程序/code/pinoutbar/DrawFrame.cpp
//Download by http://www.NewXing.com // DrawFrame.cpp : implementation file // #include "stdafx.h" //#include "pindock.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif int CALLBACK EnumFontFamProc(ENUMLOGFONT FAR *lpelf, NEWTEXTMETRIC FAR *lpntm, int FontType, LPARAM lParam); #define WS_EX_LAYERED 0x80000 #define LWA_ALPHA 0x2 #define LWA_COLORKEY 0x1 #define SHOWOFFSTEP 160 ///////////////////////////////////////////////////////////////////////////// // CDrawFrame CDrawFrame::CDrawFrame() { CDC dc; dc.CreateCompatibleDC(NULL); m_sFontFace = (::EnumFontFamilies(dc.m_hDC, _T("Tahoma"), (FONTENUMPROC) EnumFontFamProc, 0) == 0) ? _T("Tahoma") : _T("Arial"); dc.DeleteDC(); m_Size = 200; m_TitleHeight = 12; m_pDrawBar = NULL; m_bShowOff = FALSE; } CDrawFrame::~CDrawFrame() { } BEGIN_MESSAGE_MAP(CDrawFrame, CWnd) //{{AFX_MSG_MAP(CDrawFrame) ON_WM_CREATE() ON_WM_PAINT() ON_WM_NCACTIVATE() ON_WM_TIMER() ON_WM_NCHITTEST() ON_WM_NCCALCSIZE() ON_WM_SIZE() ON_WM_NCPAINT() ON_WM_NCMOUSEMOVE() ON_WM_NCLBUTTONDOWN() ON_WM_NCLBUTTONUP() //}}AFX_MSG_MAP ON_MESSAGE( WM_SHOWIT, ShowOff) ON_MESSAGE( WM_SHOWHIDE, ShowHide) ON_MESSAGE( WM_SHOWDOCKBAR, ShowDockBar) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDrawFrame message handlers int CDrawFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here return 0; } void CDrawFrame::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CRect rt; GetClientRect(rt); dc.FillSolidRect(rt, RGB(255,255,255)); // Do not call CWnd::OnPaint() for painting messages } BOOL CDrawFrame::OnNcActivate(BOOL bActive) { // TODO: Add your message handler code here and/or call default if(!bActive) PostMessage(WM_SHOWHIDE); return CWnd::OnNcActivate(bActive); } void CDrawFrame::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent == 1) { m_bShowOff = FALSE; KillTimer(1); CRect rt; GetWindowRect(rt); switch(m_pDrawBar->m_Style) { int diff; case TOPSIDE: if(rt.Height() >= m_Size) return; diff = min(SHOWOFFSTEP, m_Size - rt.Height()); rt.bottom += diff; break; case BOTTOMSIDE: if(rt.Height() >= m_Size) return; diff = min(SHOWOFFSTEP, m_Size - rt.Height()); rt.top -= diff; break; case LEFTSIDE: if(rt.Width() >= m_Size) return; diff = min(SHOWOFFSTEP, m_Size - rt.Width()); rt.right += diff; break; case RIGHTSIDE: if(rt.Width() >= m_Size) return; diff = min(SHOWOFFSTEP, m_Size - rt.Width()); rt.left -= diff; break; } m_bShowOff = TRUE; MoveWindow(rt); SetTimer(1, 100, NULL); } CWnd::OnTimer(nIDEvent); } UINT CDrawFrame::OnNcHitTest(CPoint point) { // TODO: Add your message handler code here and/or call default UINT hit = CWnd::OnNcHitTest(point); CRect rcBar; GetWindowRect(rcBar); CRect rc = m_PushPin.GetRect(); rc.OffsetRect(rcBar.TopLeft()); if (rc.PtInRect(point)) return HTOBJECT; switch(m_pDrawBar->m_Style) { case TOPSIDE: return HTBOTTOM == hit?hit: HTNOWHERE; break; case BOTTOMSIDE: return HTTOP == hit?hit: HTNOWHERE; break; case LEFTSIDE: return HTRIGHT == hit?hit: HTNOWHERE; break; case RIGHTSIDE: return HTLEFT == hit?hit: HTNOWHERE; break; } return HTNOWHERE; } void CDrawFrame::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) { // TODO: Add your message handler code here and/or call default CWnd::OnNcCalcSize(bCalcValidRects, lpncsp); CRect rc(&lpncsp->rgrc[0]); rc.DeflateRect(0, m_TitleHeight, 0, 0); lpncsp->rgrc[0] = rc; m_PushPin.Move(CPoint(rc.left+ ::GetSystemMetrics(SM_CYFRAME) , rc.top + ::GetSystemMetrics(SM_CXFRAME)) - rc.TopLeft()); } void CDrawFrame::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); CRect rt; GetWindowRect(rt); // TODO: Add your message handler code here CWnd* pWnd = GetWindow(GW_CHILD); if (pWnd != NULL) { pWnd->MoveWindow(0, 0, cx, cy); } if(m_pDrawBar == NULL || m_bShowOff) return; switch(m_pDrawBar->m_Style) { case TOPSIDE: case BOTTOMSIDE: m_Size = cy; break; case LEFTSIDE: case RIGHTSIDE: m_Size = cx; break; } } #ifndef COLOR_GRADIENTACTIVECAPTION #define COLOR_GRADIENTACTIVECAPTION 27 #define COLOR_GRADIENTINACTIVECAPTION 28 #define SPI_GETGRADIENTCAPTIONS 0x1008 #endif void CDrawFrame::OnNcPaint() { CWnd::OnNcPaint(); // TODO: Add your message handler code here CWindowDC dc(this); CRect rc, rcClient; GetClientRect(&rcClient); ClientToScreen(rcClient); GetWindowRect(rc); rc.OffsetRect(-rc.TopLeft()); rc.top += ::GetSystemMetrics(SM_CXFRAME); rc.bottom = rc.top + m_TitleHeight; rc.left +=::GetSystemMetrics(SM_CYFRAME); rc.right -=::GetSystemMetrics(SM_CYFRAME); COLORREF clrCptn = GetActiveWindow( ) == this ? ::GetSysColor(COLOR_ACTIVECAPTION) : ::GetSysColor(COLOR_INACTIVECAPTION); COLORREF clrCptnRight = GetActiveWindow( ) == this ? ::GetSysColor(COLOR_GRADIENTACTIVECAPTION) : ::GetSysColor(COLOR_GRADIENTINACTIVECAPTION); dc.FillSolidRect(&rc, ::GetSysColor(COLOR_BTNFACE)); rc.left += 15; // this will make 2^6 = 64 fountain steps int nShift = 6; int nSteps = 1 << nShift; for (int i = 0; i < nSteps; i++) { // do a little alpha blending int nR = (GetRValue(clrCptn) * (nSteps - i) + GetRValue(clrCptnRight) * i) >> nShift; int nG = (GetGValue(clrCptn) * (nSteps - i) + GetGValue(clrCptnRight) * i) >> nShift; int nB = (GetBValue(clrCptn) * (nSteps - i) + GetBValue(clrCptnRight) * i) >> nShift; COLORREF cr = RGB(nR, nG, nB); // then paint with the resulting color CRect r2 = rc; r2.left = rc.left + ((i * rc.Width()) >> nShift); r2.right = rc.left + (((i + 1) * rc.Width()) >> nShift); if (r2.Width() > 0) dc.FillSolidRect(r2, cr); } CFont font; int ppi = dc.GetDeviceCaps(LOGPIXELSX); int pointsize = MulDiv(85, 96, ppi); // 8.5 points at 96 ppi // LOGFONT lf; BOOL bFont = font.CreatePointFont(pointsize, m_sFontFace); if (bFont) { // get the text color COLORREF clrCptnText = ::GetSysColor(COLOR_CAPTIONTEXT); int nOldBkMode = dc.SetBkMode(TRANSPARENT); COLORREF clrOldText = dc.SetTextColor(clrCptnText); CFont* pOldFont = dc.SelectObject(&font); CString sTitle = m_Title; //GetWindowText(sTitle); dc.ExtTextOut(rc.left + 2, rc.top, ETO_CLIPPED, rc, sTitle, NULL); dc.SelectObject(pOldFont); dc.SetBkMode(nOldBkMode); dc.SetTextColor(clrOldText); } m_PushPin.Paint(&dc); ReleaseDC(&dc); // Do not call CWnd::OnNcPaint() for painting messages } void CDrawFrame::OnNcMouseMove(UINT nHitTest, CPoint point) { // TODO: Add your message handler code here and/or call default BOOL bNeedPaint = FALSE; CPoint pt; ::GetCursorPos(&pt); BOOL bHit = (OnNcHitTest(pt) == HTOBJECT); BOOL bLButtonDown = (::GetKeyState(VK_LBUTTON) < 0); BOOL bPushPin = (OnNcHitTest(pt) == HTOBJECT); BOOL bWasPushed = m_PushPin.bPushed; m_PushPin.bPushed = bPushPin && bLButtonDown; BOOL bWasRaised = m_PushPin.bRaised; m_PushPin.bRaised = bPushPin && !bLButtonDown; bNeedPaint |= (m_PushPin.bPushed ^ bWasPushed) || (m_PushPin.bRaised ^ bWasRaised); if (bNeedPaint) SendMessage(WM_NCPAINT); CWnd::OnNcMouseMove(nHitTest, point); } void CDrawFrame::OnNcLButtonDown(UINT nHitTest, CPoint point) { // TODO: Add your message handler code here and/or call default CWnd::OnNcLButtonDown(nHitTest, point); } LRESULT CDrawFrame::ShowHide(WPARAM, LPARAM) { ShowWindow(SW_HIDE); return 0; } LRESULT CDrawFrame::ShowDockBar(WPARAM, LPARAM) { CPinDockBar * pControlBar = (CPinDockBar*)m_pDrawBar->FindCtrlBar(GetWindow(GW_CHILD)); if(pControlBar) { pControlBar->RemoveFromDrawBar(m_pDrawBar); } return 0; } LRESULT CDrawFrame::ShowOff(WPARAM, LPARAM) { if(IsWindowVisible()) return 0; CRect rt; m_pDrawBar->GetWindowRect(rt); switch(m_pDrawBar->m_Style) { case TOPSIDE: rt.top = rt.bottom; rt.bottom += min(SHOWOFFSTEP, m_Size); break; case BOTTOMSIDE: rt.bottom = rt.top; rt.top -= min(SHOWOFFSTEP, m_Size); break; case LEFTSIDE: rt.left = rt.right; rt.right += SHOWOFFSTEP; break; case RIGHTSIDE: rt.right = rt.left; rt.left -= SHOWOFFSTEP; break; } m_bShowOff = TRUE; SetTimer(1, 100, NULL); MoveWindow(rt); ShowWindow(SW_SHOW); SetActiveWindow(); SetFocus(); return 0; } void CDrawFrame::OnNcLButtonUp(UINT nHitTest, CPoint point) { // TODO: Add your message handler code here and/or call default CWnd::OnNcLButtonUp(nHitTest, point); if (nHitTest == HTOBJECT) PostMessage(WM_SHOWDOCKBAR); }